package cc.magicjson.synthesis.chain;


import cc.magicjson.synthesis.model.Coupon;
import cc.magicjson.synthesis.context.DiscountContext;
import cc.magicjson.synthesis.model.Order;
import cc.magicjson.synthesis.model.User;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;

/**
 * 优惠券折扣检查器，负责计算优惠券抵扣金额
 */
public class CouponDiscountChecker extends DiscountChecker {

    private static final String DISCOUNT_TYPE = "COUPON";
    private static final String COUPON_USED_KEY = "COUPON_USED";

    @Override
    protected boolean doCheck(DiscountContext context) {
        Order order = context.getOrder();
        User user = order.getUser();

        // 如果用户选择不使用优惠券，则跳过优惠券折扣计算
        if (!order.isUseCoupon()) {
            return true;
        }

        // 获取当前时间
        LocalDateTime now = LocalDateTime.now();

        // 过滤出有效的优惠券（未使用、在有效期内、订单金额满足使用条件）
        List<Coupon> validCoupons = user.getCoupons().stream()
                .filter(coupon -> !coupon.isUsed())
                .filter(coupon -> now.isAfter(coupon.getStartTime()) && now.isBefore(coupon.getEndTime()))
                .filter(coupon -> order.getFinalAmount().compareTo(coupon.getThresholdAmount()) >= 0)
                .toList();

        if (validCoupons.isEmpty()) {
            return true; // 没有可用的优惠券，继续下一个处理器
        }

        // 找出最优惠的券（折扣金额最大的）
        Optional<Coupon> bestCoupon = validCoupons.stream()
                .max(Comparator.comparing(Coupon::getDiscountAmount));

        Coupon coupon = bestCoupon.get();
        BigDecimal discountAmount = coupon.getDiscountAmount();

        // 确保折扣后金额不小于0
        discountAmount = discountAmount.min(order.getFinalAmount());

        // 更新订单金额
        BigDecimal newFinalAmount = order.getFinalAmount().subtract(discountAmount);
        order.setFinalAmount(newFinalAmount);

        // 更新订单总折扣金额
        BigDecimal newDiscountAmount = order.getDiscountAmount().add(discountAmount);
        order.setDiscountAmount(newDiscountAmount);

        // A记录使用的优惠券，用于回滚
        context.setAttribute(COUPON_USED_KEY, coupon);

        // 添加折扣明细
        context.addDiscountDetail(DISCOUNT_TYPE, discountAmount);

        // 暂时不标记优惠券为已使用，在支付成功后再标记

        return true; // 继续处理下一个折扣
    }

    @Override
    protected void doRollback(DiscountContext context) {
        // 获取使用的优惠券
        Coupon coupon = context.getAttribute(COUPON_USED_KEY);
        if (coupon == null) {
            return; // 没有使用优惠券，不需要回滚
        }

        BigDecimal discountAmount = coupon.getDiscountAmount();
        Order order = context.getOrder();

        // 恢复订单金额
        order.setFinalAmount(order.getFinalAmount().add(discountAmount));

        // 恢复订单折扣金额
        order.setDiscountAmount(order.getDiscountAmount().subtract(discountAmount));

        // 从折扣明细中移除
        context.getDiscountDetails().remove(DISCOUNT_TYPE);
    }
}
